/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */

package server;

import domen.Dolazak;
import domen.Trening;
import domen.Vezbac;
import java.io.IOException;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
import java.net.Socket;
import java.net.SocketException;
import java.util.LinkedList;
import java.util.logging.Level;
import java.util.logging.Logger;
import server.kontrolerAL.KontrolerAL;
import server.util.Transfer;

/**
 *
 * @author Ivan Ivic
 */
public class ServerThread extends Thread {
    private Socket socket;
    private ObjectOutputStream out;
    private ObjectInputStream in;

    public ServerThread(Socket socket) throws IOException {
        this.socket = socket;
        out = new ObjectOutputStream(socket.getOutputStream());
        in = new ObjectInputStream(socket.getInputStream());
    }

    @Override
    public void run() {
        int brOperacije = 0;
        try
        {
            while (brOperacije != Transfer.KRAJ_RADA)
            {
                Transfer t;
                t = (Transfer) in.readObject();
                brOperacije = t.getBrojOperacije();
                izvrsiOperaciju(t);
            }
        }
        catch (Exception e)
        {
            if (e.getClass() == SocketException.class)
            {
                System.out.println("\n---Klijent zavrsio sa radom---\n");
            }
        }
    }

    private void izvrsiOperaciju(Transfer t)
    {
        Vezbac vezbac;
        Trening trening;
        Dolazak dolazak;
        int signal = 0;
        switch(t.getBrojOperacije())
        {
            case Transfer.VRATI_SVE_TRENINGE:
                LinkedList<Trening> listaTreninga = KontrolerAL.vratiSveTreninge();
                posaljiObjekat(listaTreninga, t);
                break;
            case Transfer.KREIRAJ_VEZBACA:
                vezbac = (Vezbac) t.getObjekat();
                signal = KontrolerAL.kreirajVezbaca(vezbac);
                KontrolerAL.sacuvajTreningZaVezbaca(vezbac, vezbac.getTrening());
                t.setSignal(signal);
                posaljiObjekat(null, t);
                break;
            case Transfer.PRONADJI_VEZBACE:
                vezbac = (Vezbac) t.getObjekat();
                LinkedList<Vezbac> listaVezbaca = KontrolerAL.pronadjiVezbace(vezbac);
                posaljiObjekat(listaVezbaca, t);
                break;
            case Transfer.VRATI_VEZBACA:
                vezbac = (Vezbac) t.getObjekat();
                vezbac = KontrolerAL.vratiVezbaca(vezbac.getVezbacID());
                trening = KontrolerAL.vratiTreningZaVezbaca(vezbac);
                vezbac.setTrening(trening);
                posaljiObjekat(vezbac, t);
                break;
            case Transfer.SACUVAJ_VEZBACA:
                vezbac = (Vezbac) t.getObjekat();
                signal = KontrolerAL.sacuvajVezbaca(vezbac);
                KontrolerAL.sacuvajTreningZaVezbaca(vezbac, vezbac.getTrening());
                t.setSignal(signal); // 9013, 9014
                posaljiObjekat(null, t);
                break;
            case Transfer.OBRISI_VEZBACA:
                vezbac = (Vezbac) t.getObjekat();
                signal = KontrolerAL.obrisiVezbaca(vezbac);
                t.setSignal(signal); // 9015, 9016
                posaljiObjekat(null, t);
                break;
            case Transfer.KREIRAJ_TRENING:
                trening = (Trening) t.getObjekat();
                signal = KontrolerAL.kreirajTrening(trening);
                t.setSignal(signal);
                posaljiObjekat(null, t);
                break;
            case Transfer.VRATI_TRENING:
                trening = (Trening) t.getObjekat();
                trening = KontrolerAL.vratiTrening(trening.getSifraTreninga());
                posaljiObjekat(trening, t);
                break;
            case Transfer.SACUVAJ_TRENING:
                trening = (Trening) t.getObjekat();
                signal = KontrolerAL.sacuvajTrening(trening); // 9013, 9014
                t.setSignal(signal);
                posaljiObjekat(null, t);
                break;
            case Transfer.OBRISI_TRENING:
                trening = (Trening) t.getObjekat();
                signal = KontrolerAL.obrisiTrening(trening); // 9015, 9016
                t.setSignal(signal);
                posaljiObjekat(null, t);
                break;
            case Transfer.VRATI_DOLASKE:
                dolazak = (Dolazak) t.getObjekat();
                LinkedList<Dolazak> ld = KontrolerAL.vratiDolaske(dolazak);
                posaljiObjekat(ld, t);
                break;
            case Transfer.SACUVAJ_DOLAZAK:
                dolazak = (Dolazak) t.getObjekat();
                signal = KontrolerAL.sacuvajDolazak(dolazak);
                t.setSignal(signal);
                posaljiObjekat(null, t);
                break;
            case Transfer.VRATI_BROJ_DOLAZAKA:
                dolazak = (Dolazak) t.getObjekat();
                int brojDolazaka = KontrolerAL.vratiBrojDolazaka(dolazak);
                posaljiObjekat(brojDolazaka, t);
                break;
        }
    }

    private void posaljiObjekat(Object o, Transfer t)
    {
        t.setObjekat(o);
                try {
                    out.writeObject(t);
                } catch (IOException ex) {
                    Logger.getLogger(ServerThread.class.getName()).log(Level.SEVERE, null, ex);
                }
    }
}
